package com.final_不可修改;

public class final细节01 {
    /**
     *1.final修饰的属性叫常量，一般用XX_XX_XX的大写加横线隔开
     *
     * 2.final修饰的属性在定义时就必须赋初值，不允许在定义后修改，赋值位置可以如下：
     *  (1) 在定义时直接赋值  public final int NUM = 10;
     *  (2) 在构造方法中赋值
     *  (3) 在代码块中赋值
     *
     * 3.如果final修饰的属性是静态属性，则赋值位置可以如下：
     *  (1) 在定义时直接赋值  public final int NUM = 10;
     *  (2) 在静态代码块中赋值
     *  (3) 不能在构造方法中赋值，因为static修饰的属性在类加载时已经赋值，而构造方法在创建对像时才执行，导致final修饰的属性不能被赋初值；
     *
     *  4.final类不能继承，但是可以创建对象  看main方法
     *
     *  5.如果类不是final类，但含有final修饰的方法，虽然不能重写final方法 但 可以继承后使用  看main方法
     */

    public static void main(String[] args) {
        CC cc = new CC();

        EE ee = new EE();
        ee.method();
    }
}

//2. final修饰的属性在定义时就必须赋初值，不允许在定义后修改，赋值位置可以如下：
class AA{
//    (1) 在定义时直接赋值  public final int NUM = 10;
    public final int NUM1 = 10;
//    (2) 在构造方法中赋值
    public final int NUM2;

    public AA(int NUM2) {
        this.NUM2 = NUM2;
    }
//    (3) 在代码块中赋值
    public final int NUM3;
    {
        NUM3 = 10;
    }

}

class BB{
//    (1) 在定义时直接赋值  public static final int NUM = 10;
    public static final int NUM1 = 10;
//    (2) 在静态代码块中赋值,静态代码块在类加载时执行，所以NUM2在类加载时就已经赋值了;
    public static final int NUM2;
    static{
        NUM2 = 10;
    }
}

// 4.final类不能继承，但是可以创建对象  看main方法
final class CC{  }


//5.如果类不是final类，但含有final修饰的方法，虽然不能重写final方法 但 可以继承后使用  看main方法
class DD{
    public final void method(){
        System.out.println("DD 的 method 方法");
    }
}
class EE extends DD{
//    public void method(){  // 报错, final方法不能被重写,但可以继承使用final修饰的方法
//        System.out.println("EE 的 method 方法");
//    }
}